#pragma once

#include <string>
#include <vector>
#include <unordered_set>

struct sqlite3;

namespace FileScanner {

struct FileRecord {
    std::string path;
    std::string md5;
    long long size;
};

class Database {
public:
    explicit Database(const std::string& dbPath);
    ~Database();

    /**
     * 初始化数据库，创建表和索引
     */
    bool initialize();

    /**
     * 检查文件是否已存在于数据库中
     * @param path 文件路径
     * @param size 文件大小
     * @return true 如果文件已存在且大小匹配
     */
    bool hasFile(const std::string& path, long long size);

    /**
     * 插入新的文件记录
     * @param path 文件路径
     * @param md5 MD5 校验和
     * @param size 文件大小
     * @return true 如果插入成功
     */
    bool insertFile(const std::string& path, const std::string& md5, long long size);

    /**
     * 预加载所有文件路径到内存
     */
    void preloadFilePaths();

    /**
     * 获取所有文件记录
     */
    std::vector<FileRecord> getAllFiles();

    /**
     * 删除指定的文件记录
     * @param path 文件路径
     * @return true 如果删除成功
     */
    bool removeFile(const std::string& path);

    /**
     * 获取数据库中的文件总数
     */
    long long getFileCount();

    /**
     * 获取所有重复的文件记录（按文件大小降序排列）
     */
    std::vector<FileRecord> getDuplicateFiles();

private:
    sqlite3* db_;
    std::string dbPath_;
    std::unordered_set<std::string> cachedPaths_;
    bool pathsCached_;

    bool executeSQL(const std::string& sql);
};

} // namespace FileScanner
